En omfattende guide til distribusjon av Python-pakker via PyPI, som dekker beste praksis for versjonshåndtering, verktøy og arbeidsflyter for globale utviklere.
Distribusjon av Python-pakker: Publisering på PyPI og versjonshåndtering
Pythons omfattende økosystem drives av en enorm samling pakker, lett tilgjengelige gjennom Python Package Index (PyPI). Denne guiden gir en omfattende oversikt over hvordan du kan distribuere dine egne Python-pakker via PyPI, for å sikre at de er tilgjengelige for utviklere over hele verden. Vi vil utforske de essensielle verktøyene, beste praksis for versjonshåndtering og arbeidsflyter for å lage og publisere høykvalitets Python-pakker.
Hvorfor distribuere din Python-pakke?
Å distribuere din Python-pakke gir en rekke fordeler:
- Dele arbeidet ditt: Lar andre utviklere enkelt gjenbruke koden din, noe som fremmer samarbeid og innovasjon. Se for deg et globalt team som bruker dine spesialiserte dataanalyseverktøy bygget i Python.
- Avhengighetsstyring: Forenkler prosessen med å håndtere avhengigheter i andre prosjekter. Pakken din kan installeres med en enkelt kommando, sammen med alle dens avhengigheter.
- Bidrag til åpen kildekode: Gjør det mulig for deg å bidra til åpen kildekode-miljøet og få anerkjennelse for arbeidet ditt. Mange kritiske programvarekomponenter er åpen kildekode-pakker vedlikeholdt av utviklere over hele verden.
- Versjonskontroll og oppdateringer: Gir en strukturert måte å håndtere versjoner, lansere oppdateringer og rette feil på. Dette sikrer at brukere alltid har tilgang til den nyeste og mest pålitelige versjonen av pakken din.
- Enkel installasjon: Forenkler installasjonen for brukere gjennom
pip install ditt-pakkenavn.
Essensielle verktøy for distribusjon av Python-pakker
Flere verktøy er essensielle for å lage og distribuere Python-pakker:
- setuptools: Et mye brukt bibliotek for å definere pakkemetadata, inkludert navn, versjon, avhengigheter og inngangspunkter. Det er de facto-standarden for pakking av Python-prosjekter.
- wheel: Et distribusjonsformat som gir en mer effektiv og pålitelig installasjonsprosess sammenlignet med kildedistribusjoner. Wheels er forhåndsbygde distribusjoner som kan installeres uten å kreve kompilering.
- twine: Et verktøy for å laste opp pakken din sikkert til PyPI. Twine krypterer dine legitimasjons- og pakkedata under overføring, og beskytter mot avlytting og man-in-the-middle-angrep.
- venv/virtualenv: Dette er verktøy for å lage isolerte Python-miljøer. Å bruke virtuelle miljøer er avgjørende for å håndtere avhengigheter og unngå konflikter mellom forskjellige prosjekter.
Sette opp prosjektet ditt
Før du kan distribuere pakken din, må du strukturere prosjektet ditt riktig.
Eksempel på prosjektstruktur
my_package/ ├── my_package/ │ ├── __init__.py │ ├── module1.py │ └── module2.py ├── tests/ │ ├── __init__.py │ ├── test_module1.py │ └── test_module2.py ├── README.md ├── LICENSE ├── setup.py └── .gitignore
Forklaring:
- my_package/: Hovedmappen som inneholder pakkens kildekode.
- my_package/__init__.py: Gjør
my_package-mappen til en Python-pakke. Den kan være tom eller inneholde initialiseringskode. - my_package/module1.py, my_package/module2.py: Dine Python-moduler som inneholder den faktiske koden.
- tests/: En mappe som inneholder enhetstestene dine. Det er avgjørende å skrive tester for å sikre kvaliteten og påliteligheten til pakken din.
- README.md: En Markdown-fil som gir en beskrivelse av pakken din, bruksanvisninger og annen relevant informasjon. Dette er ofte det første brukere ser på PyPI.
- LICENSE: En fil som inneholder lisensen pakken din distribueres under (f.eks. MIT, Apache 2.0, GPL). Å velge en passende lisens er essensielt for å spesifisere hvordan andre kan bruke koden din.
- setup.py: Hovedkonfigurasjonsfilen som definerer pakkens metadata og byggeinstruksjoner.
- .gitignore: Spesifiserer filer og mapper som skal ignoreres av Git (f.eks. midlertidige filer, byggeartefakter).
Opprette setup.py-filen
Filen setup.py er hjertet i pakkedistribusjonen din. Den inneholder metadata om pakken din og instruksjoner for å bygge og installere den. Her er et eksempel:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="my_package", # Erstatt med ditt pakkenavn
version="0.1.0",
author="Your Name", # Erstatt med ditt navn
author_email="your.email@example.com", # Erstatt med din e-post
description="En liten eksempelpakke",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/yourusername/my_package", # Erstatt med URL-en til ditt repository
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
install_requires=[
"requests", # Eksempel på avhengighet
],
)
Forklaring:
- name: Navnet på pakken din, som vil bli brukt på PyPI. Velg et unikt og beskrivende navn.
- version: Versjonsnummeret til pakken din. Følg semantisk versjonering (se nedenfor).
- author, author_email: Ditt navn og e-postadresse.
- description: En kort beskrivelse av pakken din.
- long_description: En lengre, mer detaljert beskrivelse, vanligvis lest fra
README.md-filen din. - long_description_content_type: Spesifiserer formatet på din lange beskrivelse (f.eks. "text/markdown").
- url: URL-en til pakkens hjemmeside (f.eks. GitHub-repo).
- packages: En liste over pakker som skal inkluderes i distribusjonen din.
setuptools.find_packages()finner automatisk alle pakker i prosjektet ditt. - classifiers: Metadata som hjelper brukere med å finne pakken din på PyPI. Velg passende klassifiserere fra listen over Trove Classifiers. Vurder å inkludere klassifiserere for støttede Python-versjoner, operativsystemer og lisenser.
- python_requires: Spesifiserer den minste Python-versjonen som kreves for å bruke pakken din.
- install_requires: En liste over avhengigheter som pakken din krever. Disse avhengighetene vil bli installert automatisk når pakken din installeres.
Versjonshåndtering: Semantisk versjonering
Semantisk versjonering (SemVer) er et utbredt versjoneringssystem som gir en klar og konsekvent måte å kommunisere arten av endringer i pakken din.
Et SemVer-versjonsnummer består av tre deler: MAJOR.MINOR.PATCH.
- MAJOR: Økes når du gjør inkompatible API-endringer. Dette indikerer en betydelig endring som kan kreve at brukere må oppdatere koden sin.
- MINOR: Økes når du legger til funksjonalitet på en bakoverkompatibel måte. Dette signaliserer nye funksjoner eller forbedringer som ikke ødelegger eksisterende kode.
- PATCH: Økes når du gjør bakoverkompatible feilrettinger. Dette er for små rettelser som ikke legger til nye funksjoner eller ødelegger eksisterende funksjonalitet.
Eksempler:
- 1.0.0: Første utgivelse.
- 1.1.0: La til en ny funksjon uten å ødelegge eksisterende kode.
- 1.0.1: Rettet en feil i 1.0.0-utgivelsen.
- 2.0.0: Gjorde inkompatible API-endringer.
Å bruke SemVer hjelper brukere å forstå konsekvensene av å oppgradere til en ny versjon av pakken din.
Bygge pakken din
Når du har konfigurert setup.py-filen din, kan du bygge pakken.
- Opprett et virtuelt miljø: Det anbefales på det sterkeste å opprette et virtuelt miljø for å isolere pakkens avhengigheter. Bruk
python3 -m venv .venv(ellervirtualenv .venv) og aktiver det (source .venv/bin/activatepå Linux/macOS,.venv\Scripts\activatepå Windows). - Installer byggeavhengigheter: Kjør
pip install --upgrade setuptools wheel. - Bygg pakken: Kjør
python setup.py sdist bdist_wheel. Denne kommandoen lager to distribusjonsfiler idist-mappen: en kildedistribusjon (sdist) og en wheel-distribusjon (bdist_wheel).
sdist inneholder kildekoden og setup.py-filen. bdist_wheel er en forhåndsbygd distribusjon som kan installeres raskere.
Publisere pakken din på PyPI
Før du kan publisere pakken din, må du opprette en konto på PyPI (https://pypi.org/) og lage et API-token. Dette tokenet vil bli brukt til å autentisere opplastingene dine.
- Registrer deg på PyPI: Gå til https://pypi.org/account/register/ og opprett en konto.
- Opprett et API-token: Gå til https://pypi.org/manage/account/, rull ned til "API tokens"-seksjonen, og opprett et nytt token. Lagre dette tokenet trygt, da du vil trenge det for å laste opp pakken din.
- Installer Twine: Kjør
pip install twine. - Last opp pakken din: Kjør
twine upload dist/*. Du vil bli bedt om brukernavn (__token__) og passord (API-tokenet du opprettet).
Viktig sikkerhetsmerknad: Aldri legg inn API-tokenet ditt i repositoryet. Lagre det sikkert og bruk miljøvariabler eller andre sikre metoder for å få tilgang til det under opplastingsprosessen.
Teste installasjonen av pakken din
Etter å ha publisert pakken din, er det viktig å teste at den kan installeres korrekt.
- Opprett et nytt virtuelt miljø: Dette sikrer at du tester installasjonen i et rent miljø.
- Installer pakken din: Kjør
pip install ditt-pakkenavn. - Importer og bruk pakken din: I en Python-tolk, importer pakken din og verifiser at den fungerer som forventet.
Kontinuerlig integrasjon og kontinuerlig levering (CI/CD)
For å automatisere prosessen med å bygge, teste og publisere pakken din, kan du bruke CI/CD-verktøy som GitHub Actions, GitLab CI eller Travis CI.
Her er et eksempel på en GitHub Actions-arbeidsflyt som bygger og publiserer pakken din til PyPI:
name: Publish to PyPI
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build package
run: python setup.py sdist bdist_wheel
- name: Publish package to PyPI
run: |
twine upload dist/* \
-u __token__ \
-p ${{ secrets.PYPI_API_TOKEN }}
Forklaring:
- Denne arbeidsflyten utløses når en ny utgivelse blir publisert på GitHub.
- Den sjekker ut koden, setter opp Python, installerer avhengigheter, bygger pakken og laster den opp til PyPI.
secrets.PYPI_API_TOKENer en GitHub-hemmelighet som lagrer ditt PyPI API-token. Du må konfigurere denne hemmeligheten i innstillingene for ditt GitHub-repository.
Beste praksis for distribusjon av Python-pakker
- Skriv omfattende dokumentasjon: Inkluder en detaljert
README.md-fil, samt API-dokumentasjon ved hjelp av verktøy som Sphinx. Klar og fullstendig dokumentasjon er avgjørende for å gjøre pakken din enkel å bruke. - Skriv enhetstester: Test koden din grundig for å sikre dens kvalitet og pålitelighet. Bruk et testrammeverk som pytest eller unittest.
- Følg stilguiden PEP 8: Følg stilguiden Python Enhancement Proposal 8 (PEP 8) for å sikre konsistent og lesbar kode.
- Bruk en lisens: Velg en passende åpen kildekode-lisens for å spesifisere hvordan andre kan bruke koden din.
- Hold avhengighetene dine oppdatert: Oppdater jevnlig pakkens avhengigheter for å dra nytte av feilrettinger, sikkerhetsoppdateringer og nye funksjoner.
- Bruk et virtuelt miljø: Utvikle og test alltid pakken din i et virtuelt miljø for å isolere avhengigheter.
- Vurder internasjonalisering (i18n) og lokalisering (l10n): Hvis pakken din håndterer bruker-rettet tekst eller data, bør du vurdere å gjøre den tilpasningsdyktig til forskjellige språk og regioner. Dette utvider din potensielle brukerbase globalt. Verktøy som Babel kan hjelpe med dette.
- Håndter forskjellige tidssoner og valutaer: Hvis pakken din håndterer datoer, tider eller økonomiske transaksjoner, vær oppmerksom på forskjellige tidssoner og valutaer rundt om i verden. Bruk passende biblioteker og API-er for å håndtere disse kompleksitetene korrekt.
- Gi klare feilmeldinger: Skriv informative feilmeldinger som hjelper brukere å forstå hva som gikk galt og hvordan de kan fikse det. Oversett disse feilmeldingene til forskjellige språk hvis mulig.
- Tenk på tilgjengelighet: Ta hensyn til brukere med nedsatt funksjonsevne når du designer pakkens grensesnitt og dokumentasjon. Følg retningslinjer for tilgjengelighet for å sikre at pakken din kan brukes av alle.
Avanserte emner
- Navneromspakker (Namespace packages): Lar deg dele opp en enkelt Python-pakke over flere mapper eller til og med flere distribusjoner.
- Inngangspunkter (Entry points): Lar deg definere funksjoner eller klasser som kan kalles fra andre pakker eller fra kommandolinjen.
- Datafiler: Lar deg inkludere ikke-Python-filer (f.eks. datafiler, konfigurasjonsfiler) i distribusjonen din.
- Betingede avhengigheter: Lar deg spesifisere avhengigheter som bare kreves under visse betingelser (f.eks. på et spesifikt operativsystem).
Konklusjon
Å distribuere din Python-pakke på PyPI er en flott måte å dele arbeidet ditt med verden og bidra til Python-økosystemet. Ved å følge trinnene og beste praksis beskrevet i denne guiden, kan du lage og publisere høykvalitets Python-pakker som er enkle å installere, bruke og vedlikeholde. Husk å prioritere klar dokumentasjon, grundig testing og konsekvent versjonshåndtering for å sikre suksessen til pakken din.